package tt.dz.order.vo;

import org.apache.commons.lang3.StringUtils;

import tt.dz.order.exception.BusinessException;
import tt.dz.order.pojo.AliPayCallBackRecord;
import tt.dz.order.pojo.OrderInfo;
import tt.dz.order.util.OrderAppConfig;
import tt.dz.order.util.OrderConstant;
import tt.dz.order.util.OrderConstant.AliPayTradeStatus;

/**
 * 
 * 
 * @name 向主服务器发送现金卡充值<br>
 *       电子钱包充值
 * @author Anson
 * @version 1.0
 * @summary
 * @desc
 *
 */
public class RechargeOnlineAccount extends BaseVo {
	/* 否 主服务编号 */
	private String serviceNo;
	/* 是 卡号 */
	private String cardNo;
	/* 否 卡类型：06线下卡（现金卡） */
	private String cardType;
	/* 是 实际收款运营商（只能是自营运营商） */
	private String receiver;
	/* 是 发生金额 */
	private String paymentAmount;
	/*
	 * 是 "支付类型码：1 第三方实时支付,2 统付,3 企业支付,4 电子钱包支付,5 代付,6 /* 线下卡,7 现金支付"
	 */
	private int payTypeCode;
	/* 是 "支付状态,1 已支付/支付成功,2 待支付,3 支付中,4 支付失败,5 支付超时" */
	private int payStateCode;
	/* 否 第三方支付流水,如payStateCode是1，该字段不能为空 */
	private String thdPaySeq;
	/* 否 第三方转账金额，payStateCode是1，该字段不能为空 */
	private String thdPayAmount;
	/* 否 第三方手续费 */
	private String thdPoundage;
	/*
	 * 否 第三方转账完成时间，如payStateCode是1，该字段不能为空，格式“yyyy-MM- dd HH:mm:ss”
	 */
	private String thdEndTime;
	/* 否 第三方应答码 */
	private String responseCode;
	/* 否 终端交易时间，格式“yyyy-MM-dd HH:mm:ss” */
	private String tranTime;
	/* 否 支付渠道编码，第三方实时支付时，该字段不能为空 */
	private String channelCode;
	/* 是 业务系统编号(104 自主app,201 乐视 等等) */
	private String appId;

	/**
	 * 默认的构造函数
	 */
	public RechargeOnlineAccount() {
		super();
	}

	/**
	 * 传入ali支付返回结果集合转换成当前充值帐号vo
	 * 
	 * @param aliPayCallBackRecord
	 */
	public RechargeOnlineAccount(AliPayCallBackRecord aliPayCallBackRecord) throws BusinessException {
		if (aliPayCallBackRecord == null || StringUtils.isEmpty(aliPayCallBackRecord.getOrderNo())) {
			throw new BusinessException("支付宝转换成现金充值中，缺少订单编号");
		}
		String orderNo = aliPayCallBackRecord.getOrderNo();
		OrderInfo orderInfo = OrderInfo.getById(orderNo);
		if (orderInfo == null) {
			throw new BusinessException("支付宝转换成现金充值中，未能找到订单信息[orderNo=" + orderNo + "]");
		}
		// 卡号
		this.cardNo = orderInfo.getCardNo();
		// 交易金额
		this.paymentAmount = aliPayCallBackRecord.getTotalFee();
		// 收款运营商
		this.receiver = OrderAppConfig.GET().getMerchantCode();
		// "支付类型码：1 第三方实时支付,2 统付,3 企业支付,4 电子钱包支付,5 代付,6 /* 线下卡,7 现金支付"
		this.payTypeCode = OrderConstant.OrderPayWay.thirdImmediately.value();
		// 支付状态
		this.payStateCode = this.convertAlipayPayStatusCode(aliPayCallBackRecord.getTradeStatus());
		// appid 来自于电桩自己的appid
		this.appId = OrderConstant.BizSystemCode.DzApp.value();
		//第三方实时支付，必须填写支付渠道
		this.channelCode = OrderConstant.OrderPayChannelCode.alipay.value();
	}

	/**
	 * 转换支付宝交易结果
	 * 
	 * @param alipayTradeStatus
	 * @return
	 */
	private int convertAlipayPayStatusCode(String alipayTradeStatus) {
		int code = -1;
		if (AliPayTradeStatus.TRADE_SUCCESS.value().equals(alipayTradeStatus)
				|| AliPayTradeStatus.TRADE_FINISHED.value().equals(alipayTradeStatus)) {
			code = 2;
			// 支付成功
			code = 1;
		} else if (AliPayTradeStatus.WAIT_BUYER_PAY.value().equals(alipayTradeStatus)) {
			// 支付等待
			code = 2;
		} else {
			// 支付失败
			code = 4;
		}
		return code;
	}

	public String getServiceNo() {
		return serviceNo;
	}

	public void setServiceNo(String serviceNo) {
		this.serviceNo = serviceNo;
	}

	public String getCardNo() {
		return cardNo;
	}

	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}

	public String getCardType() {
		return cardType;
	}

	public void setCardType(String cardType) {
		this.cardType = cardType;
	}

	public String getReceiver() {
		return receiver;
	}

	public void setReceiver(String receiver) {
		this.receiver = receiver;
	}

	public String getPaymentAmount() {
		return paymentAmount;
	}

	public void setPaymentAmount(String paymentAmount) {
		this.paymentAmount = paymentAmount;
	}

	public int getPayTypeCode() {
		return payTypeCode;
	}

	public void setPayTypeCode(int payTypeCode) {
		this.payTypeCode = payTypeCode;
	}

	public int getPayStateCode() {
		return payStateCode;
	}

	public void setPayStateCode(int payStateCode) {
		this.payStateCode = payStateCode;
	}

	public String getThdPaySeq() {
		return thdPaySeq;
	}

	public void setThdPaySeq(String thdPaySeq) {
		this.thdPaySeq = thdPaySeq;
	}

	public String getThdPayAmount() {
		return thdPayAmount;
	}

	public void setThdPayAmount(String thdPayAmount) {
		this.thdPayAmount = thdPayAmount;
	}

	public String getThdPoundage() {
		return thdPoundage;
	}

	public void setThdPoundage(String thdPoundage) {
		this.thdPoundage = thdPoundage;
	}

	public String getThdEndTime() {
		return thdEndTime;
	}

	public void setThdEndTime(String thdEndTime) {
		this.thdEndTime = thdEndTime;
	}

	public String getResponseCode() {
		return responseCode;
	}

	public void setResponseCode(String responseCode) {
		this.responseCode = responseCode;
	}

	public String getTranTime() {
		return tranTime;
	}

	public void setTranTime(String tranTime) {
		this.tranTime = tranTime;
	}

	public String getChannelCode() {
		return channelCode;
	}

	public void setChannelCode(String channelCode) {
		this.channelCode = channelCode;
	}

	public String getAppId() {
		return appId;
	}

	public void setAppId(String appId) {
		this.appId = appId;
	}
}
